package com.hibernate.db;

import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hibernate.domain.Person;
import com.hibernate.utils.HibernateUtils;

/**
 * hibernate对象状态测试类
 * @author LC
 *
 */
public class ObjectStateTest extends HibernateUtils {
	
	@Test
	public void testObjectState() {
		//临时状态，其特征是该对象与hibernate没有关系
		Person person = new Person() ;
		person.setName("姗姗") ;
		person.setDescription("美女") ;
		//开启一个session连接
		Session session = sessionFactory.openSession() ;
		//将person对象保存到session当中，person对象由临时状态转化成持久化状态
		//特征：这个时候数据库没有对应的数据，但是该对象在hibernate的一级缓存当中
		session.save(person) ;
		//开启事务
		Transaction transaction = session.beginTransaction() ;
		//提交事务，将session中的person对象中的数据insert到数据表中，person对象仍然在session之中，处于持久化状态
		transaction.commit() ;
		//关闭session，清空session中的数据，person对象变为托管状态
		//特征：person对象仍然存在，但与hibernate没有关系
		session.close() ;
	}
	
	@Test
	public void testGetPerson() {
		//打开一个session
		Session session = sessionFactory.openSession() ;
		//session.get方法提取出来的是一个持久化状态的对象，同时也产生了一个它的副本
		Person person = (Person)session.get(Person.class, 2L) ;
		//修改person对象的属性
		person.setDescription("修改") ;
		//开启事务
		Transaction transaction = session.beginTransaction() ;
		//提交事务，事务提交的时候，hibernate内部会让持久化person对象与其副本进行比对，如果发生改变，则发出update语句更新数据库
		transaction.commit() ;
		session.close() ;
	}
	
	@Test
	public void testEvictPerson() {
		Session session = sessionFactory.openSession() ;
		Person person = (Person)session.get(Person.class, 2L) ;	//持久化状态
		person.setDescription("1111") ;
		//把person由持久化状态变成托管状态
		session.evict(person) ;	//托管状态
		session.update(person) ;	//持久化状态
		Transaction transaction = session.beginTransaction() ;	
		//当事务提交的时候，hibernate内部只管持久化状态的对象，对于临时状态和脱管状态是不管的。
		transaction.commit() ;	
		session.close() ;
	}
	
	/**
	 * session.close()之后，当前session中的所有对象都将由持久化状态变成托管状态
	 * 一个对象是否是持久化状态是针对某一个session而言的
	 */
	@Test
	public void testSession() {
		Session session = sessionFactory.openSession() ;
		Person person = (Person)session.get(Person.class, 2L) ;
		person.setDescription("2222") ;
		Transaction transaction = session.beginTransaction() ;
		transaction.commit() ;
		session.close() ;	
		
		session = sessionFactory.openSession() ; //重新打开一个session
		transaction = session.beginTransaction() ;
		person.setDescription("3333") ;	//此时的person为相对于新打开的session来说是一个临时状态
		transaction.commit() ;
		session.close() ;
	}

}
